package com.icode50.spring;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author Allen
 *	Spring3.1以后的写法
 *	拦截器不生效常见问题：
 *	1）是否有加@Configuration
 *	2）拦截路径是否有问题 **  和 *
 *	3）拦截器最后路径一定要 “/**”， 如果是目录的话则是/*/
/**
 * Filter和interceptor拦截器区别 1）Filter是基于函数回调 doFilter()，而Interceptor则是基于AOP思想
 * 2）Filter在只在Servlet前后起作用，而Interceptor够深入到方法前后、异常抛出前后等
 * 3）Filter依赖于Servlet容器即web应用中，而Interceptor不依赖于Servlet容器所以可以运行在多种环境。
 * 4）在接口调用的生命周期里，Interceptor可以被多次调用，而Filter只能在容器初始化时调用一次。
 * 5）Filter和Interceptor的执行顺序：过滤前->拦截前->action执行->拦截后->过滤后
 */
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// TODO Auto-generated method stub
		System.out.println("MyWebMvcConfigurer ---- addInterceptors");
//		registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/interceptors/*");
//		registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/interceptors/*");

		WebMvcConfigurer.super.addInterceptors(registry);
	}

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**").allowedOrigins("*").allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
				// 针对header单独设置，不然无法获取header中的请求信息，前端也无法拿到响应中的header信息，OPTIONS请求也会经过拦截器，在进行登录拦截时候要注意特殊处理
				.allowedHeaders("*")
				.exposedHeaders("access-control-allow-headers", "access-control-allow-methods",
						"access-control-allow-origin", "access-control-max-age", "X-Frame-Options")
				.maxAge(3600).allowCredentials(true);
	}
}
